home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 July / macformat-026.iso / mac / Shareware City / Science / µSim 1.0 folder / source / DoEditDialog.c < prev    next >
Encoding:
Text File  |  1995-03-10  |  6.2 KB  |  239 lines  |  [TEXT/MMCC]

  1. /*
  2. Copyright © 1993,1994 by Fabrizio Oddone
  3. ••• ••• ••• ••• ••• ••• ••• ••• ••• •••
  4. This source code is distributed as freeware: you can copy, exchange, modify this
  5. code as you wish. You may include this code in any kind of application: freeware,
  6. shareware, or commercial, provided that full credits are given.
  7. You may not sell or distribute this code for profit.
  8. */
  9.  
  10. //#pragma load "MacDump"
  11.  
  12. #include    "UtilsSys7.h"
  13. #include    "Globals.h"
  14. #include    "Animation.h"
  15. #include    "DoEditDialog.h"
  16. #include    "DoMenu.h"
  17. #include    "Main.h"
  18. #include    "MovableModal.h"
  19. #include    "Registers.h"
  20. #include    "SimUtils.h"
  21. #include    "Independents.h"
  22. #include    "Conversions.h"
  23.  
  24. #if defined(FabSystem7orlater)
  25.  
  26. #pragma segment Rare
  27.  
  28. static short EditValue(ConstStr255Param str0, ConstStr255Param str1, short edit, short base);
  29. static void EditUserProc(DialogPtr myDPtr, Handle itemHandle, short itemHit);
  30. static Boolean EditNumPreProcessKey(EventRecord *thEv, DialogPtr theD);
  31.  
  32. static short    lastChoice;
  33.  
  34. //static pascal Boolean EditNumFilter(DialogPtr, EventRecord *, short *);
  35.  
  36. /* DoEditDump: we shall edit a memory location */
  37.  
  38. Boolean DoEditDump(short *addr, short wordn)
  39. {
  40. Str27    tempStr0;
  41. Str15    tempStr1;
  42. register short    newv;
  43. register Boolean changed;
  44.  
  45. GetIndHString((StringPtr)&tempStr0, Get1Resource('STR#', kValueFollow), kAtMem);
  46. ShortToHexString(wordn, tempStr1);
  47. newv = EditValue(tempStr0, tempStr1, *addr, kPOP_HEX);
  48. if (changed = (newv != *addr))
  49.     *addr = newv;
  50. return changed;
  51. }
  52.  
  53. /* DoEditDialog: we shall edit a register or an internal processor part */
  54.  
  55. Boolean DoEditDialog(short item, short pclass, short base)
  56. {
  57. Str27    tempStr0;
  58. Str31    tempStr1;
  59. register short *oldv;
  60. register short    newv;
  61. register Boolean changed;
  62.  
  63. GetIndHString((StringPtr)&tempStr0, Get1Resource('STR#', kValueFollow), kInThe);
  64. GetIndHString((StringPtr)&tempStr1, Get1Resource('STR#', pclass), item);
  65. oldv = pclass == kPART_NAMES ? &gParts[item] : &gRegs[item];
  66. newv = EditValue(tempStr0, tempStr1, *oldv, base);
  67. if (changed = (newv != *oldv)) {
  68.     *oldv = newv;
  69.     if (pclass == kPART_NAMES)
  70.         ChangedBox(item);
  71.     }
  72. return changed;
  73. }
  74.  
  75. enum {
  76. kItemEditValue = 3,
  77. kItemPopupBase
  78. };
  79.  
  80. static short EditValue(ConstStr255Param str0, ConstStr255Param str1, short edit, short base)
  81. {
  82.  
  83. enum {
  84. kDLOG_EDITVALUE = 261
  85. };
  86.  
  87. Str255    EditStr;
  88. long    tempLong;
  89.  
  90. dialogItems    things[] = {{ ok, 0, 1L },
  91.                         { cancel, 0, 0L },
  92.                         { kItemEditValue, 0, 0L },
  93.                         { kItemPopupBase, 0, 0L },
  94.                         { 0, 0, 0L}
  95.                         };
  96.  
  97. things[kItemEditValue-1].refCon = (long)&EditStr;
  98. things[kItemPopupBase-1].refCon = base;
  99. tempLong = edit;
  100. lastChoice = base;
  101. ParamText(str0, str1, nil, nil);
  102. FromNumToString(EditStr, edit, base);
  103. //things[kItemEditValue-1].refCon = ;
  104.  
  105. if (HandleMovableModalDialog(things, gPrefs.remembWind ? &gPrefs.editValueTL : nil, nil, nil, nil, nil, EditUserProc,
  106.     AdjustMenus,
  107.     Handle_My_Menu,
  108.     DomyKeyEvent,
  109.     EditNumPreProcessKey,
  110.     nil,
  111.     DoUpdate,
  112.     DoActivate,
  113.     DoHighLevelEvent,
  114.     DoOSEvent,
  115.     DoIdle,
  116.     ULONG_MAX,
  117.     kDLOG_EDITVALUE) == ok) {
  118.     tempLong = 0L;
  119.     FromStringToNum((ConstStr255Param)&EditStr, &tempLong, lastChoice);
  120.     }
  121. return tempLong;
  122. }
  123.  
  124. void EditUserProc(DialogPtr myDPtr, Handle itemHandle, short itemHit)
  125. {
  126. Str255    tempStr;
  127. Rect    tempRect;
  128. Handle    tempH;
  129. long    tempnum;
  130. short    null;
  131. register short    newChoice;
  132.  
  133. if (itemHit == kItemPopupBase)
  134.     if ((newChoice = GetControlValue((ControlHandle)itemHandle)) != lastChoice) {
  135.         GetDialogItem(myDPtr, kItemEditValue, &null, &tempH, &tempRect);
  136.         GetDialogItemText(tempH, tempStr);
  137.         tempnum = 0L;
  138.         FromStringToNum((ConstStr255Param)&tempStr, &tempnum, lastChoice);
  139.         FromNumToString(tempStr, (short)tempnum, newChoice);
  140.         lastChoice = newChoice;
  141.         SetDialogItemText(tempH, tempStr);
  142.         SelectDialogItemText(myDPtr, kItemEditValue, 0, 0x7FFF);
  143.         }
  144. }
  145.  
  146. Boolean EditNumPreProcessKey(EventRecord *thEv, DialogPtr theD)
  147. {
  148. short    iHit;
  149. unsigned char    keypressed;
  150. Boolean    result = true;
  151.  
  152. keypressed = CHARFROMMESSAGE(thEv->message);
  153. if (lastChoice != kPOP_TEXT) {
  154.     if ((keypressed >= 'a') && (keypressed <= 'z')) {
  155.         keypressed -= 'a' - 'A';    /* cambiare! */
  156.         CHARFROMMESSAGE(thEv->message) = keypressed;
  157.         }
  158.     iHit = ((DialogPeek)theD)->editField + 1;
  159.     if (keypressed >= 32 && ((thEv->modifiers & cmdKey) == 0)) {
  160.         switch( lastChoice ) {
  161.             case kPOP_DEC:    return( Munger((Handle)GetString(kSTR_DECALLOWED), 1L,
  162.                                     &keypressed, 1L, 0L, 0L) >= 0L );
  163.                             break;
  164.             case kPOP_HEX:    return( Munger((Handle)GetString(kSTR_HEXALLOWED), 1L,
  165.                                     &keypressed, 1L, 0L, 0L) >= 0L );
  166.                             break;
  167.             case kPOP_OCT:    return( Munger((Handle)GetString(kSTR_OCTALLOWED), 1L,
  168.                                     &keypressed, 1L, 0L, 0L) >= 0L );
  169.                             break;
  170.             case kPOP_BIN:    return( Munger((Handle)GetString(kSTR_BINALLOWED), 1L,
  171.                                     &keypressed, 1L, 0L, 0L) >= 0L );
  172.                             break;
  173.             }
  174.         }
  175.     }
  176. return result;
  177. }
  178.  
  179. /* EditNumFilter: the filter filters entered characters, of course */
  180. /*
  181. static pascal Boolean EditNumFilter(DialogPtr theD, EventRecord *thEv, short *iHit)
  182. {
  183. GrafPtr    savePort;
  184. unsigned char    keypressed;
  185. register Boolean    retVal;
  186.  
  187. switch(thEv->what) {
  188.     case keyDown    :
  189.     case autoKey    :
  190.         keypressed = CHARFROMMESSAGE(thEv->message);
  191.         if (lastChoice != kPOP_TEXT) {
  192.             if ((keypressed >= 'a') && (keypressed <= 'z')) {
  193.                 keypressed -= 'a' - 'A';
  194.                 CHARFROMMESSAGE(thEv->message) = keypressed;
  195.                 }
  196.             if ((keypressed >= 32) && (keypressed != 0x7F) && ((thEv->modifiers & cmdKey) == 0)) {
  197.                 *iHit = kItemEditValue;
  198.                 switch( lastChoice ) {
  199.                     case kPOP_DEC:    return( Munger((Handle)GetString(kSTR_DECALLOWED), 1L,
  200.                                             &keypressed, 1L, 0L, 0L) < 0L );
  201.                                     break;
  202.                     case kPOP_HEX:    return( Munger((Handle)GetString(kSTR_HEXALLOWED), 1L,
  203.                                             &keypressed, 1L, 0L, 0L) < 0L );
  204.                                     break;
  205.                     case kPOP_OCT:    return( Munger((Handle)GetString(kSTR_OCTALLOWED), 1L,
  206.                                             &keypressed, 1L, 0L, 0L) < 0L );
  207.                                     break;
  208.                     case kPOP_BIN:    return( Munger((Handle)GetString(kSTR_BINALLOWED), 1L,
  209.                                             &keypressed, 1L, 0L, 0L) < 0L );
  210.                                     break;
  211.                     }
  212.                 }
  213.             }
  214.         break;
  215.     case updateEvt:
  216.         if (theD != (DialogPtr)thEv->message) {
  217.             DoUpdate(thEv);
  218.             *iHit = kfakeUpdateItem;
  219.             return true;
  220.             }
  221.         break;
  222.     case activateEvt:
  223.         if (theD != (DialogPtr)thEv->message) {
  224.             DoActivate(thEv);
  225.             *iHit = kfakeUpdateItem;
  226.             return true;
  227.             }
  228.         break;
  229.     }
  230. GetPort(&savePort);
  231. SetPort(theD);
  232. retVal = StdFilterProc(theD, thEv, iHit);
  233. SetPort(savePort);
  234. return retVal;
  235. }
  236. */
  237. #endif
  238.  
  239.